package br.com.knowledge.view.struts.actions;

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.hibernate.Session;

import br.com.knowledge.helper.ConsistFile;
import br.com.knowledge.persistence.hibernate.dao.AcdProjetolinguagemDAO;
import br.com.knowledge.persistence.hibernate.dao.CadLinguagemDAO;
import br.com.knowledge.persistence.hibernate.dao.CadProjetoDAO;
import br.com.knowledge.persistence.hibernate.entities.AcdProjetolinguagem;
import br.com.knowledge.persistence.hibernate.entities.CadLinguagem;
import br.com.knowledge.persistence.hibernate.entities.CadProjeto;
import br.com.knowledge.persistence.hibernate.entities.FntObjeto;
import br.com.knowledge.persistence.hibernate.dao.FntFonteDAO;
import br.com.knowledge.persistence.hibernate.entities.FntFonte;
import br.com.knowledge.view.struts.objects.FileLoad;
import br.com.knowledge.view.struts.objects.WindowLoad;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/")
@ResultPath("/")
public class FonteAction extends ActionSupport implements SessionAware{
	
	public void setSession(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
	}

	private List<CadProjeto> listaProjetos;
	private CadProjeto projetoLoadFiles;
	private ArrayList<String> arrayFiles = new ArrayList<String>();
	private ArrayList<FntFonte> listaFontes;
	
	@SuppressWarnings("unchecked")
	private void loadListProjeto(){
		CadProjetoDAO cDaoProjeto = new CadProjetoDAO();
		try {
			setListaProjetos(cDaoProjeto.findAll());
		} catch (Exception e) {
			// TODO: add log;
			e.printStackTrace();
		}
	}
	@SkipValidation
	@Action(value = "chama-loadfiles", results = { @Result(name = SUCCESS, location = "/pages/loadFiles.jsp"),
			@Result(name = ERROR, location = "/pages/Erro.jsp"),
			@Result(name = INPUT, location = "/pages/inicial.jsp") })
	public String chamaCadTipoSgdb() {
		loadListProjeto();
		return SUCCESS;
	}

	
	@Action(value = "load-files", results = {
			@Result(name = SUCCESS, location = "/pages/inicial.jsp"),
			@Result(name = ERROR, location = "/pages/loadFiles.jsp"),
			@Result(name = INPUT, location = "/pages/loadFiles.jsp") })	
	public String loadFiles(){
		String loadExtensao = new String();
		String pathLoad = "C:\\desenvolvimento\\sam\\";
		CadProjeto cProjeto = new CadProjeto();
		CadProjetoDAO cDaoProjeto = new CadProjetoDAO();
		Session sessionProjeto = cDaoProjeto.getSession();
		FntObjeto fntWindow = new FntObjeto(); 
		try{
			sessionProjeto.beginTransaction();
			sessionProjeto.getTransaction().begin();
			setProjetoLoadFiles(cDaoProjeto.findById(getProjetoLoadFiles().getId()));
			AcdProjetolinguagemDAO acdLingDAO = new AcdProjetolinguagemDAO();
			CadLinguagemDAO cDaoLinguagem = new CadLinguagemDAO();	
			List<AcdProjetolinguagem>listaProjetoLinguagem = acdLingDAO.findByProjeto(getProjetoLoadFiles().getId());
			for( AcdProjetolinguagem projetoLinguagem : listaProjetoLinguagem ){					
				List<FileLoad>listaArquivos = br.com.knowledge.helper.ManipulationFile.cargaArquivos(projetoLinguagem.getCadLinguagem().getExtensoes(), pathLoad);
				for(FileLoad arquivo : listaArquivos){
					FntFonte arquivoFonte = new FntFonte();
    				arquivoFonte.setCadLinguagem(projetoLinguagem.getCadLinguagem());
    				arquivoFonte.setNomefonte(arquivo.getNameLoad().toUpperCase());
    				arquivoFonte=criarFonte(arquivoFonte);
    					File fileOpen = new File(arquivo.getPathLoad()+ "\\" + arquivo.getNameLoad());
    					String strBufferFile =  FileUtils.readFileToString(fileOpen, "UTF-8"); 
    					arquivo.setFileLoad(strBufferFile);
    			/*		Long strBufferFile =  Long.parseLong(FileUtils.readFileToString(fileOpen, "UTF-8")); 
    					arquivo.setFileLoad(strBufferFile.toString());*/
    					List<WindowLoad>listaWindow= new ConsistFile().consistFile(arquivo.getFileLoad(),arquivoFonte );
    					for(WindowLoad window:listaWindow){
    						List<WindowLoad>listaObjetos= new ConsistFile().consistWindow(window);
    						for(WindowLoad objectWindow:listaObjetos){
    							if (new ConsistFile().consistMethodSQL(objectWindow)){
    							}
    						}
    					}
    				}
				}
			
		}catch (Exception ex) {
			sessionProjeto.getTransaction().rollback();
		}finally{
		//	sessionProjeto.close();
		}
		return SUCCESS;
	}
	
	
	@Action(value = "cadastra-fonte", results = {
			@Result(name = SUCCESS, location = "/pages/listarTiposDados.jsp"),
			@Result(name = ERROR, location = "/pages/cadastraTipoDadoErro.jsp"),
			@Result(name = INPUT, location = "/pages/cadastraTipoDado.jsp") })	
	public FntFonte criarFonte(FntFonte fonte){
		FntFonteDAO cadFonteDAO = new FntFonteDAO();
		Session sessionFonte = cadFonteDAO.getSession();
		List<FntFonte> fntFind = new ArrayList<FntFonte>();
		try {			
			sessionFonte.beginTransaction();
			fntFind=cadFonteDAO.findByProperty("nomefonte", fonte.getNomefonte());
			if(fntFind.isEmpty()==false){
				for(FntFonte fntTemp:fntFind){
					fonte=cadFonteDAO.findById(fntTemp.getId());
					break;
				}
			}
			else{
				cadFonteDAO.save(fonte);
				sessionFonte.getTransaction().commit();
			}			
		}catch (Exception ex) {
			// TODO: handle exception
			sessionFonte.getTransaction().rollback();
			fonte = new FntFonte();
			//return false;
		}finally{
			sessionFonte.close();
		}
		return fonte;
	}
	
	@Action(value = "listar-fontes", results = {
			@Result(name = SUCCESS, location = "/pages/listarFontes.jsp"),
			@Result(name = ERROR, location = "/pages/error.jsp"),
			@Result(name = INPUT, location = "/pages/inicial.jsp") })	
	public String listarFonte(){
	
		FntFonteDAO cDaoFonte = new FntFonteDAO();
		Session sessionFonte = cDaoFonte.getSession();
		
		try{
			listaFontes = new ArrayList<FntFonte>();
			sessionFonte.beginTransaction().begin();
			listaFontes = (ArrayList<FntFonte>) cDaoFonte.findAll();
		}catch (Exception e) {

		}finally{
			sessionFonte.close();
		}
		
		if(listaFontes.isEmpty() == true){
			return INPUT;
		}else{
			return SUCCESS;	
		}
	}
	

	public void setProjetoLoadFiles(CadProjeto projetoLoadFiles) {
		this.projetoLoadFiles = projetoLoadFiles;
	}
	public CadProjeto getProjetoLoadFiles() {
		return projetoLoadFiles;
	}
	public void setListaProjetos(List<CadProjeto> listaProjetos) {
		this.listaProjetos = listaProjetos;
	}
	public List<CadProjeto> getListaProjetos() {
		return listaProjetos;
	}
	public void setListaFontes(ArrayList<FntFonte> listaFontes) {
		this.listaFontes = listaFontes;
	}
	public ArrayList<FntFonte> getListaFontes() {
		return listaFontes;
	}
}